<?php
	/**
	 * Arquivo: geral.inc
	 * @package Default
	 * @sub-package FORMATAR
	 * @page-level 1
	 */
	/**
	 * Classe de formatação 
	 * @package Default
	 * @return void 
	 */
  	class FORMATAR
	  	{
	  	/**
		 * Guarda o dia
		 * @access private
		 * @var integer
		 */
		private $dia;
		/**
		 * Guarda o dia da semana
		 * @access private
		 * @var integer
		 */
		private $d_semana;
		/**
		 * Guarda o mês
		 * @access private
		 * @var integer
		 */
		private $mes;
		/**
		 * Guarda o ano
		 * @access public
		 * @var integer
		 */
		public $ano;
		/**
		 * Guarda os dias da semana por extenso
		 * @access private
		 * @var string[]
		 */
		private $semana = array ("Domingo","Segunda-Feira","Ter&ccedil;a-Feira","Quarta-Feira","Quinta-Feira","Sexta-Feira","S&aacute;bado");
		/**
		 * Guarda os meses do ano por extenso
		 * @access private
		 * @var mixed[]
		 */
		private $meses = array (12,"Janeiro","Fevereiro","Mar&ccedil;o","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro");
		/**
		 * Construtor da classe FORMATAR
		 */
		public function __construct()
		  	{
			$this->dia = date('j');
			$this->d_semana = date('w');
			$this->mes = date('n');
			$this->ano = date('Y');
			}
		/**
		 * Destrutor da Classe FORMATAR
		 */
		public function __destructed()
		  	{
			}
		/**
		 * Formata uma data.
		 * @param string $data 
		 * @param integer $cod
		 * @return string $data
		 */
		public function data_conv($data,$cod=1)
		  	{
		  	if(strlen($data)!= 0)
		  		{
				switch ($cod)
			  		{
					case 1:
				  		{
						$aux = explode("-",$data);
						$data = $aux[2]."/".$aux[1]."/".$aux[0];
						break;
						}
					case 2:
					  	{
						$aux = explode("/",$data);
						$data = $aux[2]."-".$aux[1]."-".$aux[0];
						break;
						}
					case 3:
						{
						$aux = explode("/",$data);
						$data = $aux[2].$aux[1].$aux[0];
						break;
						}
					case 4:
						{
						$aux = str_split($data,4);
						$aux2 = str_split($aux[1],2);
						$data = $aux[0]."-".$aux2[0]."-".$aux2[1];
						break;
						}
					}
				}
			else
				{
				$data = "null";
				}
			return $data;
			}
		/**
		 * Calcula a diferença entre duas datas em dias
		 * @param string $inicio 
		 * @param string $fim
		 * @return integer $dias
		 */
		public function Dias($inicio, $fim) 
			{

        	$di = explode("-",$inicio);
        	$df = explode("-", $fim);

        	$dinicio = mktime(date('H'), date('i'), date('s'), $di[1], $di[2], $di[0]);
        	$dfim = mktime(date('H'), date('i'), date('s'), $df[1], $df[2], $df[0]);
        	//$dias = abs((($dinicio - $dfim) / (60*60*24)));
        	$dias = (($dinicio - $dfim) / (60*60*24));

        	return $dias;

    		}
    	/**
		 * Escreve uma data por extenso.
		 * @param string $data 
		 * @return string
		 */
    	public function data_extenso($data)
			{
			$aux = explode("-",$data);
			return $aux[2]." de ".$this->meses[(int)$aux[1]]." de ".$aux[0];
			}
		/**
		 * Converte um valor passado formatando-o
		 * @param float $valor
		 * @param integer $cod 
		 * @return float $valor
		 */
		public function valor_conv($valor,$cod=1)
		  	{
			if (!$valor)
			  	{
				$valor = 0;
				}
			switch ($cod)
			  	{
				case 1:
				  	{
					$valor = str_replace(".","",$valor);
					$valor = str_replace(",",".",$valor);
					break;
					}
				case 2:
				  	{
					$valor = str_replace(",",".",$valor);
					$valor = number_format($valor, 2, ',', '.');
					break;
					}
				case 3:
					{
					$valor = str_replace(".",",",$valor);
					break;
					}
				}
			return $valor;
			}
		/**
		 * Calcula data inicial e final de um período informado
		 * @param string $mesano 
		 * @return mixed[] $data
		 */
		public function periodo($mesano)
		  	{
			$aux = explode("/",$mesano);
	  	  	$data[0]=$aux[1]."-".$aux[0]."-01";
  	 		switch($aux[0])
		    	{	
			  	case 1:
		  		case 3:
	  			case 5:
				case 7:
			  	case 8:
		  		case 10:
	  			case 12:
			    	{
		  			$data[1] = $aux[1]."-".$aux[0]."-31";
	  				break;
  					}
			  	case 2:
		  	  		{
	  				if (($aux[1]%4)==0)
  				  		{
				  		$data[1] = $aux[1]."-".$aux[0]."-29";
			  			}
		  			else
   				  	{
					  	$data[1] = $aux[1]."-".$aux[0]."-28";
				  		}
			  		break;
		  			}
	  			case 4:
  				case 6:
			  	case 9:
	   		case 11:
  			  		{
				  	$data[1] = $aux[1]."-".$aux[0]."-30";
			  		break;
		  			}
	  			}
  			return ($data);
			}
		/**
		 * Retorno o dia de hoje formatado para impressão e por extenso.
		 * 
		 * @return string
		 */
		public function hoje()
		  	{
			$string = "Dourados-MS., ";
			$string .= $this->semana[$this->d_semana].", ";
			$string .= $this->dia." de ".$this->meses[$this->mes]." de ".$this->ano.".";
			return ($string);
			}
		/**
		 * Retorno o dia de hoje formatado para utilização no sistema. 
		 * 
		 * @return string
		 */
		public function data_hoje()
		  	{
			return ($this->ano."-".$this->mes."-".$this->dia);
			}
		/**
		 * Converter um texto passado do Padrão ISO para UTF-8 e vice e versa 
		 * @param string $texto
		 * @param integer $cod
		 * @return string $texto
		 */
		public function converter_texto($texto,$cod=1)
		  	{
			switch($cod)
			  	{
				case 1:
				  	{
					$texto = iconv("ISO-8859-1","UTF-8",$texto);
					break;
					}
				case 2:
				  	{
					$texto = iconv("UTF-8","ISO-8859-1",$texto);
					break;
					}
				}
			return $texto;
			}
		/**
		 * Converter um texto passado para maiúsculo.
		 * @param string $texto
		 * @return string $texto
		 */
		public function texto_maiusculo($texto)
			{
			$array_minuscula = array("á" => "Á" ,"à" => "À","ã" => "Ã", "â" => "Â", "é" => "É", "ê" => "Ê", "ô" => "Ô", "ó" => "Ó", "õ" => "Õ", "í" => "Í", "ú" => "Ú", "ü" => "Ü", "ç" => "Ç");
			$aux = strtoupper($texto);
			return (strtr($aux,$array_minuscula));
			}	
		/**
		 * Aplica e remove máscara para placas.
		 * @param string $placa
		 * @param integer $cod
		 * @return string $placa
		 */
		public function placa($placa,$cod=0)
	  		{
			switch($cod)
			  	{
				case 0:
				  	{
					$placa = str_replace("-","",$placa);
					break;
					}
				case 1:
				  	{
					$aux = str_split($placa,3);
					$placa = $aux[0]."-".$aux[1].$aux[2];
					break;
					}
				}
			return ($placa);
			}
		/**
		 * Remove máscara de CEP
		 * @param string $cep
		 * @param integer $cod
		 * @return string $cep
		 */
		public function cep($cep,$cod=0)
			{
			$mascara = array(".","-");
			switch($cod)
				{
				case 0:
					{
					$cep = str_replace($mascara,"",$cep);
					break;
					}
				}
			return ($cep);
			}
		/**
		 * Aplica e remove máscara de CPF.
		 * @param string $cpf
		 * @param integer $cod
		 * @return string $cpf
		 */
		public function cpf($cpf,$cod=0)
			{
			$mascara = array(".","-");
			switch($cod)
				{
				case 0:
					{
					$cpf = str_replace($mascara,"",$cpf);
					break;
					}
				case 1:
					{
					$aux = str_split($cpf,3);
					$cpf = $aux[0].".".$aux[1].".".$aux[2]."-".$aux[3];
					break;
					}
				}
			return ($cpf);
			}
		/**
		 * Remove máscara de telefone.
		 * @param string $tel
		 * @param integer $cod
		 * @return string $tel
		 */
		public function telefone($tel,$cod=0)
			{
			$mascara = array("(",")","-"," ");
			switch($cod)
				{
				case 0:
					{
					$tel = str_replace($mascara,"",$tel);
					break;
					}
				}
			return ($tel);
			}
		/**
		 * Aplica e remove máscara de CNPJ.
		 * @param string $cnpj
		 * @param integer $cod
		 * @return string $cnpj
		 */
		function cnpj($cnpj,$cod=0)
			{
			$mascara = array(".","/","-");
			switch($cod)
				{
				case 0:
					{
					$cnpj = str_replace($mascara,"",$cnpj);
					break;
					}
				case 1:
					{
					$aux = str_split($cnpj);
	      		$cnpj = $aux[0].$aux[1].".".$aux[2].$aux[3].$aux[4].".".$aux[5].$aux[6].$aux[7]."/".$aux[8].$aux[9].$aux[10].$aux[11]."-".$aux[12].$aux[13];
					break;
					}
				}
			return ($cnpj);
			}
		/**
		 * Aplica máscara para CPF e CNPJ.
		 * @param string $valor
		 * @param integer $tipo
		 * @param integer $modo
		 * @return string $retorno
		 */
		public function cpf_cnpj($valor,$tipo,$modo=0)
      	{
      	switch ($tipo)
      		{
      		case "CPF":
      			{
      			if ($modo == 0)
      				{
      				$aux = str_split($valor);
      				$retorno = $aux[0].$aux[1].$aux[2].".".$aux[3].$aux[4].$aux[5].".".$aux[6].$aux[7].$aux[8]."-".$aux[9].$aux[10];
      				}
      			break;
      			}
      		case "CNPJ":
      			{
      			if ($modo == 0)
      				{
      				$aux = str_split($valor);
      				$retorno = $aux[0].$aux[1].".".$aux[2].$aux[3].$aux[4].".".$aux[5].$aux[6].$aux[7]."/".$aux[8].$aux[9].$aux[10].$aux[11]."-".$aux[12].$aux[13];
      				}
      			break;
      			}
      		}
      	return $retorno;
      	}
      /**
		 * Escreve um número por extenso, considerando moeda ou não
		 * @param float $valor
		 * @param integer $tipo
		 * @param integer $caixa
		 * @return string $rt
		 */
     	public function extenso($valor=0,$tipo=0,$caixa=0) 
			{
			/**
			 * Copyright (C) 2002 Lyma
			 *    This program is free software; you can redistribute it and/or modify
			 *    it under the terms of the GNU General Public License as published by
			 *    the Free Software Foundation; either version 2 of the License, or
			 *    (at your option) any later version.
			 *
			 *    This program is distributed in the hope that it will be useful,
			 *    but WITHOUT ANY WARRANTY; without even the implied warranty of
			 *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
			 *    GNU General Public License for more details.
			 *
			 *    You should have received a copy of the GNU General Public License
			 *    along with this program; if not, write to the Free Software
			 *    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
			 *
			 *    Lyma (lyma@lymas.com)
			 *    http://lymas.com
			 *
			 *    Esta função recebe um valor numérico e retorna uma string contendo o
			 *    valor de entrada por extenso.
			 *    entrada: $valor (use ponto para centavos.)
			 *    Ex.:
			 *
			 *    echo extenso("12428.12"); //retorna: doze mil, quatrocentos e vinte e oito reais e doze centavos
			 *
			 *    ou use:
			 *    echo extenso("12428.12", true); //esta linha retorna: Doze Mil, Quatrocentos E Vinte E Oito Reais E Doze Centavos
			 *
			 *    saída..: string com $valor por extenso em reais e pode ser com iniciais em maiúsculas (true) ou não.
			 *
			 *
			 * Changelog: Author: Rodrigo (rodrigo.bc@uol.com.br) Um pequeno detalhe nessa excelente função...
			 * Em vez de imprimir no caso: Doze Mil, Quatrocentos E Vinte E Oito Reais E Doze Centavos.
			 *              esta imprimi: Doze Mil, Quatrocentos e Vinte e Oito Reais e Doze Centavos.
			 *
			 *          É Muito Mais Bonito, Não?
			 *
			 * Rodrigo (rodrigo.bc@uol.com.br)
			 *
			 *
			 * Changelog: Author: Alessandro Lima (mutana3@yahoo.com.br)
			 *
			 * Acrecentei e modifiquei a função para que a mesma imprima em caixa alta e baixa eliminando o problema do strtolower e strtoupper que não funcionam em caracteres com acento .
			 *
			 * O código original (1.0) já era muito bom .
			 *
			 * Alessandro
			 *
			 * ChangeLog: Author: Alcione Ferreira (alcione.sombra@gmail.com
			 *	Utilizando o código alterado, modifiquei para um método da minha classe, colocando algumas funcionalidades
			 * a mais, como definir a caixa alta ou não do retorno e o tipo que representa a escrita com ou sem os centavos,
			 * ou seja para fins monetário ou não. 
			 */
			$rt = "";
    		$valor = strval($valor);
    		$valor = str_replace(",",".",$valor);

    		if($tipo==1)
    			{
    			$singular = array("centavo", "real", "mil", "milhão", "bilhão", "trilhão", "quatrilhão");
    			$plural = array("centavos", "reais", "mil", "milhões", "bilhões", "trilhões","quatrilhões");
    			}
    		else
    			{
    			$pos   = strpos($valor,".");
    			$valor = substr($valor,0,$pos);
    			$singular = array("", "", "mil", "milhão", "bilhão", "trilhão","quatrilhão");
    			$plural = array("", "", "mil", "milhões", "bilhões", "trilhões","quatrilhões");
    			}
    		
			$c = array("", "cem", "duzentos", "trezentos", "quatrocentos","quinhentos", "seiscentos", "setecentos", "oitocentos", "novecentos");
			$d = array("", "dez", "vinte", "trinta", "quarenta", "cinquenta","sessenta", "setenta", "oitenta", "noventa");
			$d10 = array("dez", "onze", "doze", "treze", "quatorze", "quinze","dezesseis", "dezesete", "dezoito", "dezenove");
			$u = array("", "um", "dois", "três", "quatro", "cinco", "seis","sete", "oito", "nove");
			$z=0;
			$valor = number_format($valor, 2, ".", ".");
			$inteiro = explode(".", $valor);
			for($i=0;$i<count($inteiro);$i++)
				{
        		for($ii=strlen($inteiro[$i]);$ii<3;$ii++)
        			{
            	$inteiro[$i] = "0".$inteiro[$i];
            	}
            }
			$fim = count($inteiro) - ($inteiro[count($inteiro)-1] > 0 ? 1 : 2);
			for ($i=0;$i<count($inteiro);$i++) 
				{
        		$valor = $inteiro[$i];
        		$rc = (($valor > 100) && ($valor < 200)) ? "cento" : $c[$valor[0]];
        		$rd = ($valor[1] < 2) ? "" : $d[$valor[1]];
        		$ru = ($valor > 0) ? (($valor[1] == 1) ? $d10[$valor[2]] : $u[$valor[2]]) : "";

        		$r = $rc.(($rc && ($rd || $ru)) ? " e " : "").$rd.(($rd && $ru) ? " e " : "").$ru;
        		$t = count($inteiro)-1-$i;
        		$r .= $r ? " ".($valor > 1 ? $plural[$t] : $singular[$t]) : "";
        		if ($valor == "000")
        			{
        			$z++;
        			} 
        		elseif ($z > 0)  
        			{
        			$z--;
        			}
        		if (($t==1) && ($z>0) && ($inteiro[0] > 0)) 
        			{
        			$r .= (($z>1) ? " de " : "").$plural[$t];
        			}
        		if ($r) 
        			{
        			$rt = $rt . ((($i > 0) && ($i <= $fim) && ($inteiro[0] > 0) && ($z < 1)) ? ( ($i < $fim) ? " e " : " e ") : " ") . $r;
        			}
    			}
    			
    		if($caixa)
    			{
    			$rt = strtoupper($rt);
    			$maiusculas = array("Á","À","Â","Ã","É","Ê","Í","Ó","Ô","Õ","Ú","Û");
    			$minusculas = array("á","à","â","ã","é","ê","í","ó","ô","õ","ú","û");
    
    
    			for($i=0;$i<count($maiusculas);$i++)
    				{
    				$rt = ereg_replace($minusculas[$i],$maiusculas[$i],$rt);
    				}
    			}
    		return $rt;                      
        	}			
		};//FORMATAR
?>